package es.duma.presentation;

import es.duma.terminales.TerminalesDUMA;
import es.duma.terminales.TerminalesDUMA.Terminal;
import es.duma.util.config.Configurator;

import es.duma.util.log.Log;

import es.duma.util.xmlparse.search.DumaSearch;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

import java.util.Enumeration;

import java.util.Hashtable;

import java.util.Iterator;

import javax.servlet.*;
import javax.servlet.http.*;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

/**
 * Realiza operaciones referentes a la presentacion de resultados al usuario.
 * Deteccion de terminal  y carga de sipositivos configurados en el sistema
 */
public class PresentationManager{

    /**
     * Nombre para mostrar en los mensajes de log
     */
    private static final String CLASS_NAME="[PresentationManager]";
    
    
    /**
     * Valores por defecto para caracterisitcas de terminal
     */
    public static final String TERMINAL_DEFAULT="pc";
    public static final String LANGUAGE_DEFAULT="xhtml";
    
    /**
     * Nombre de la pagina inicial de la herramienta de busqueda
     */
    public static final String INDEX_PAGE="index.html";
    
    
    /**
     * Listado de terminales configurados en el sistema
     */
    public static TerminalesDUMA terminales=null;
   
    
    /**
     * Obtiene la pagina inicial para las caracteristicas del terminal de usuario
     * @param request
     * @return
     */
    public static String getIndex(HttpServletRequest request){
        String index_page=getTerminalFolder(request)+INDEX_PAGE;
        Log.debug(CLASS_NAME+" El path para la pagina principal del terminal es: "+index_page);
        return index_page;
    }
    
    /**
     * Obtiene el path de la plantilla de transformacion de presentacion de resultados, 
     * segun las caractristicas del terminal de usuario detectado y la accion solicitada
     * @param action accion solicitada para la presentacion de resultados [details->muestra detalles de un contenido]
     * @param request
     * @return
     */
    public static String getPathXSL(String action, HttpServletRequest request){
        Log.debug(CLASS_NAME+" Obteniendo el path del xsl para la accion "+action);      
        // Segun los parametros obtenidos en la peticion http se carga una interfaz final
        String folder=getTerminalFolder(request);
        Log.debug(CLASS_NAME+" Folder del terminal detectado: "+folder);
        String xslPath="";
        if (action.equalsIgnoreCase(Constants.XSL_PARAM_ACTION_DETAILS)){
            Log.debug("Details");
            xslPath=folder+"detail.xsl"; 
        }else{
            xslPath=folder+"list.xsl";                    
        }
        
        Log.debug(CLASS_NAME+" El path obtenido para el xsl es "+xslPath);
        return xslPath; 
    
    }
    
    
    
    /**
     * Obtiene la direccion del directorio donde estan las plantillas de transformacion aptas para 
     * el terminal de usuario detectado en la peticion
     * @param request
     * @return
     */
    private static String getTerminalFolder(HttpServletRequest request){
        String folderPath; 
        
        // Se obtiene la configuracion de terminales del xml si no ha sido cargada aun
        loadCfgTerminales(false);
        
        // Se obtiene el user agent del terminal de usuario
        String user_agent=RequestManager.getUserAgent(request);
                
        // Se fijan el terminal definido por defecto
        String terminal_dir=TERMINAL_DEFAULT;
        String language=LANGUAGE_DEFAULT;
        
        
        
        // Se busca si el user_agent coincide con algno de los existentes en la congiguracion
        if (terminales!=null){
            Iterator terms=terminales.getTerminal().iterator();
            while (terms.hasNext()){
                Terminal terminal=(Terminal)terms.next();
                if (user_agent.contains(terminal.getId())){
                    terminal_dir=terminal.getXslDir();
                    Log.debug("[Terminal] El terminal de usuario esta en la configuracion del sistema");
                    Log.debug("[Terminal]: ID: "+terminal.getId()+ " TEMPLATES_DIR: "+terminal_dir);
                    folderPath=Configurator.getPropertieValue("BASE_XSL")+language+"/"+terminal_dir+"/";
                    return folderPath;
                }
            }
        }
        
        // El terminal de usuario no se encuentra en el fichero de configuracion. Se devuelve la interfaz por defecto
        Log.debug("[Terminal] El terminal de usuario no esta en la configuracion del sistema. Se toman los valores por defecto");
        folderPath=Configurator.getPropertieValue("BASE_XSL")+language+"/"+terminal_dir+"/";
        return folderPath;
    }
    
    
    /**
     * Se carga la configuracion de terminales disponible en el sistema.
     * Se cargan desde el xml que se indica en la propiedad TERMINALES_CFG de la configuracion del sistema.
     * @param force
     */
    public static void loadCfgTerminales(boolean force){
        if (force || (terminales==null)){
            String path_xml_terminales=Configurator.getPropertieValue("TERMINALES_CFG");
            Log.debug("[Terminales] Intentando obtener configuracion de terminales de: "+path_xml_terminales);
            InputStream in;
            JAXBContext jaxbcontext;
            try {
                in = new FileInputStream(path_xml_terminales.substring(5));
                jaxbcontext = JAXBContext.newInstance("es.duma.terminales");
                Unmarshaller unmarshaller = jaxbcontext.createUnmarshaller();
                terminales=(TerminalesDUMA)unmarshaller.unmarshal(in);
                Log.debug("[Terminales]XML de configuracion de terminales encapsulado en el objeto.");
            } catch (FileNotFoundException e) {
                Log.error("[Terminales]Error al obtener el xml de configuración de terminales desde el InputStream. "+e);
            } catch (JAXBException e) {
                Log.error("[Terminales]Error al parsear el xml de configuración de terminales. "+e);
            }
            Log.debug("[Terminales] La configuracion de terminales se ha cargado correctamente");
        }
        
    }






}
